import java.util.Random;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        /**
         * 方法：
         *  1，实参和形参的关系
         *      对于基础类型而言，形参就相当于实参的拷贝，即“传值调用”，此时方法中对于形参的改变不会对变量本身造成影响
         *      对于引用类型而言，其实际是传递引用对象的地址，即“传址调用”，此时修改形参即可同步修改实参
         *  2，方法的重载
         *      <1> 同一个类中，可以出现多个同名方法，这些方法之间形参列表不同（参数个数或参数类型不同，强制性必须不同）
         *      <2> 方法的返回值不影响方法的重载
         *  3，方法的递归
         *      递归出口、递归体、*/
        int a = 10;
        int b = 20;
        System.out.println("交换前：");
        System.out.println("a:" + a + " b:" + b);
        swap(a, b);
        System.out.println("交换后：");
        System.out.println("a:" + a + " b:" + b);
        System.out.println("============");

        double c = 10.5;
        double d = 11.5;
        System.out.println(add(a, b));
        System.out.println(add(c, d));
        System.out.println("============");

        System.out.println(factor(1));
        System.out.println("============");

//        orderPrint(18182128);
        System.out.println("============");

        System.out.println(sum(10));
        System.out.println("============");

        System.out.println(sumEveryIndex(1234));
        System.out.println("============");

    }

    public static int sumEveryIndex(int n) {
        /**
         * 求得非负整数n每一位数字之和*/
        if(n == 0) {
            return 0;
        }

        return n % 10 + sumEveryIndex(n / 10);
    }

    public static int sum(int n) {
        /**
         * 递归求1+2+3...+n*/
        if(n == 1) {
            return 1;
        }
        return n + sum(n-1);
    }

    public static void orderPrint(int n) {
        /**
         * 按顺序打印数字的每一位*/
        if(n == 0) {
            return;
        }
        orderPrint(n / 10);
        System.out.println(n % 10);
    }

    public static int factor(int n) {
        /**
         * 递归求n的阶乘*/
        if(n == 1) {
            return n;
        }
        return n * factor(n-1);
    }

    public static int add(int x, int y) {
        /**
         * 参数列表为int*/
        return x + y;
    }

    public static double add(double x, double y) {
        /**
         * 参数列表为double*/
        return x + y;
    }

    public static void swap(int x, int y) {
        /**
         * 尝试交换两个基础变量的值*/
        int temp = x;
        x = y;
        y = temp;
    }

    public static void main2(String[] args) {
        /**
         * 猜数字游戏
         * 数字范围：[1, 100]
         * 提示方式：“大了”， “小了”， “猜对了”*/
        // 1 预处理
        Scanner scanner = new Scanner(System.in);
        welcome();

        // 2 游戏逻辑
        while(true) {
            // -1 生成目标值
            int key = 1 + new Random().nextInt(100);

            // -2 玩家猜测
            while(true) {
                // -2.1 接收猜测值
                System.out.print("请输入您需要猜测的值: ");
                String enter = scanner.next();
                if(enter.equals("break")) {
                    // --退出游戏
                    System.out.println("游戏结束！");
                    return;
                } else if(enter.equals("restart")) {
                    // --重开游戏
                    System.out.println("重开游戏！");
                    break;
                } else {
                    // --正常猜测（暂未考虑用户非法输入的情况，因为此处仅作分支、循环结构练习）
                    int guessNum = Integer.parseInt(enter);
                    if(guessNum < key) {
                        printFormat("小了");
                    } else if(guessNum > key) {
                        printFormat("大了");
                    } else {
                        // ---猜对了，游戏结束
                        printFormat("恭喜您，猜对了！");
                        return;
                    }
                }
            }
        }
    }

    public static void printFormat(String s) {
        /**
         * 给打印内容添加格式*/
        System.out.println("回馈信息：" + s);
        System.out.println("--------------");
    }

    public static void welcome() {
        /**
         * 打印欢迎信息*/
        System.out.println("欢迎游玩《猜数字游戏》！");
        System.out.println("=====================");
        System.out.println("游戏规则如下：");
        System.out.println("    1，系统生成随机的数字，数字取值区间为[1, 100]；");
        System.out.println("    2，玩家每回合输入猜测的数字，系统会根据猜测值与目标值之间的大小关系给出相应的提示；");
        System.out.println("    3，输入“break”可直接结束当前游戏；");
        System.out.println("    4，输入“restart”可重新开始游戏；");
        System.out.println("=====================");
    }

    public static void main1(String[] args) {
        /**
         * do-while循环 - 至少会执行一次循环体，本质就是先执行后判断，除了第一次不一样外并无其他区别*/
        int i = 1;
        do {
            System.out.println(i);
            i ++;
        } while(i <= 10);
    }
}
